<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Begin Jekyll SEO tag v2.7.1 -->
<title>Key 和 String | 微光</title>
<meta name="generator" content="Jekyll v4.2.1">
<meta property="og:title" content="Key 和 String">
<meta property="og:locale" content="en_US">
<meta name="description" content="Redis Key">
<meta property="og:description" content="Redis Key">
<link rel="canonical" href="/redis/data-type/key-and-string.html">
<meta property="og:url" content="/redis/data-type/key-and-string.html">
<meta property="og:site_name" content="微光">
<meta property="og:type" content="article">
<meta property="article:published_time" content="2022-01-18T01:52:04+08:00">
<meta name="twitter:card" content="summary">
<meta property="twitter:title" content="Key 和 String">
<script type="application/ld+json">
{"description":"Redis Key","url":"/redis/data-type/key-and-string.html","headline":"Key 和 String","dateModified":"2022-01-18T01:52:04+08:00","datePublished":"2022-01-18T01:52:04+08:00","@type":"BlogPosting","mainEntityOfPage":{"@type":"WebPage","@id":"/redis/data-type/key-and-string.html"},"@context":"https://schema.org"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="/assets/css/normalize.css">
  <link rel="stylesheet" href="/assets/css/style.css">
<link type="application/atom+xml" rel="alternate" href="/feed.xml" title="微光">
</head>
<body>
<header class="site-header">

  <div class="wrapper">
<a class="site-title" rel="author" href="/">微光</a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger">
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewbox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"></path>
            </svg>
          </span>
        </label>

        <div class="trigger">
<a class="page-link" href="/about/">About</a><a class="page-link" href="/doc/main">DocMain</a><a class="page-link" href="/sites.html">Sites</a>
</div>
      </nav>
</div>
</header>
<div class="x-collections-bar">
  <a href="/">Home</a>
  
    
      <a href="/algri/index">算法</a>
    
  
    
      <a href="/java/index">Java</a>
    
  
    
  
    
  
    
      <a href="/redis/index">Redis</a>
    
  
</div>

<div class="x-content-side-layout x-container">
  <div class="x-left">
    <h3>本文目录</h3>
    <ul id="toc" class="section-nav">
<li class="toc-entry toc-h2"><a href="#redis-key">Redis Key</a></li>
<li class="toc-entry toc-h2"><a href="#redis-string">Redis String</a></li>
<li class="toc-entry toc-h2"><a href="#%E4%BF%AE%E6%94%B9%E5%92%8C%E6%9F%A5%E8%AF%A2-key-%E7%A9%BA%E9%97%B4">修改和查询 key 空间</a></li>
<li class="toc-entry toc-h2"><a href="#key-%E8%BF%87%E6%9C%9F">Key 过期</a></li>
<li class="toc-entry toc-h2">
<a href="#%E6%9C%AC%E9%83%A8%E5%88%86%E6%B6%89%E5%8F%8A%E5%88%B0%E7%9A%84%E5%91%BD%E4%BB%A4%E5%88%97%E8%A1%A8">本部分涉及到的命令列表</a>
<ul>
<li class="toc-entry toc-h3"><a href="#%E5%9F%BA%E6%9C%AC-key-value-%E5%91%BD%E4%BB%A4">基本 Key Value 命令</a></li>
<li class="toc-entry toc-h3"><a href="#string-%E5%91%BD%E4%BB%A4">String 命令</a></li>
<li class="toc-entry toc-h3"><a href="#%E6%95%B4%E6%95%B0%E5%91%BD%E4%BB%A4">整数命令</a></li>
<li class="toc-entry toc-h3"><a href="#%E6%B5%AE%E7%82%B9%E6%95%B0%E5%91%BD%E4%BB%A4">浮点数命令</a></li>
</ul>
</li>
</ul>
  </div>
  <div class="x-content">
    <h1><strong>Redis - Key 和 String</strong></h1>
    <small>2022-01-18 01:52:04 +0800</small>
    
    <article class="x-article"><h2 id="redis-key">
<a class="anchor" href="#redis-key" aria-hidden="true"><span class="octicon octicon-link"></span></a>Redis Key</h2>

<p>Redis key 都是二进制安全的，这意味着你可以把任何二进制序列作为 key，小到可以是简单的 string <code class="language-plaintext highlighter-rouge">"foo"</code>，大到可以是一个 JPEG 文件内容，空 string 也是一个有效的 key。</p>

<p>使用 key 时有一些规则：</p>

<ul>
  <li>不推荐过长的 key。比如 key 的长度超过 1024 字节就不好，不只是内存问题，在查找指定 key 时会在 key 的比较上花费大量时间。如果 key 避免不了使用大值，那么取其哈希值作为 key 就比较好，比如用 SHA1 哈希，这样还可以省些内存和网络带宽。</li>
  <li>太短的 key 也不太好。比如短一点的 key <code class="language-plaintext highlighter-rouge">"u1000flw"</code> 就没有 <code class="language-plaintext highlighter-rouge">"user:1000:followers"</code> 好，后者可读性更好。虽然更短的 key 更省内存，不过我们需要在此之间找到一个平衡。</li>
  <li>尽量坚持一种模式。比如 <code class="language-plaintext highlighter-rouge">object-type:id</code> 这种就不错，可以有 <code class="language-plaintext highlighter-rouge">"user:1000"</code>。<code class="language-plaintext highlighter-rouge">.</code> 和 <code class="language-plaintext highlighter-rouge">-</code> 经常被用用于分隔多单词字段，比如 <code class="language-plaintext highlighter-rouge">"comment:123:reply.to"</code> 或者 <code class="language-plaintext highlighter-rouge">"comment:123:reply-to"</code>。</li>
  <li>Key 的最大长度是 512MB。</li>
</ul>

<h2 id="redis-string">
<a class="anchor" href="#redis-string" aria-hidden="true"><span class="octicon octicon-link"></span></a>Redis String</h2>

<p>String 是 Redis 中能和 key 关联的最简单的数据类型。</p>

<blockquote>
  <p>说明一下，这里没有把 string 翻译为“字符串”的原因是，它已经不仅仅是“字符”的“串”了。干脆直接用 string 算了。</p>
</blockquote>

<p>因为 Redis key 也是 string，所以当我们把一个 string 作为 value 关联到 key 时，实际上是把一个 string 映射到另一个 string。在一些场景下，string 类型非常有用，比如缓存 HTML 片段或者网页、</p>

<p>下面我们来玩一下 string 类型：</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">&gt;</span><span class="w"> </span><span class="nb">set </span>mykey somevalue
<span class="go">OK
</span><span class="gp">&gt;</span><span class="w"> </span>get mykey
<span class="go">"somevalue"
</span></code></pre></div></div>

<p>如你所见，我们使用 <code class="language-plaintext highlighter-rouge">SET</code> 和 <code class="language-plaintext highlighter-rouge">GET</code> 命令来设置和获取 string value。注意，如果在 redis 中一个 key 已经有了对应的 value，那么 <code class="language-plaintext highlighter-rouge">SET</code> 会用新 value 替换掉它，即使这个已经存在的 value 不是 string。</p>

<p>Value 可以是任何一种类型的 string，比如可以是一个 JPEG 图片。Value 的最大长度不可超过 512 MB。</p>

<p><code class="language-plaintext highlighter-rouge">SET</code> 命令还有一些选项来提供额外功能，比如如果 key 已经存在时 set 会失败，或者反过过来，只有 key 已经存在是才会成功：</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">&gt;</span><span class="w"> </span><span class="nb">set </span>mykey newval nx
<span class="go">(nil)
</span><span class="gp">&gt;</span><span class="w"> </span><span class="nb">set </span>mykey newval xx
<span class="go">OK
</span></code></pre></div></div>

<p>即使 string 是基本数据类型，但我们还是可以对他们执行一些有趣的操作。比如原子性自增：</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">&gt;</span><span class="w"> </span><span class="nb">set </span>counter 100
<span class="go">OK
</span><span class="gp">&gt;</span><span class="w"> </span>incr counter
<span class="go">(integer) 101
</span><span class="gp">&gt;</span><span class="w"> </span>incr counter
<span class="go">(integer) 102
</span><span class="gp">&gt;</span><span class="w"> </span>incrby counter 50
<span class="go">(integer) 152
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">INCR</code> 命令会把 string 值转成整数，然后对其加一，最后用加一后的 value 替换旧 value。其他类似的命令有 <code class="language-plaintext highlighter-rouge">INCRBY</code>、<code class="language-plaintext highlighter-rouge">DECR</code>、<code class="language-plaintext highlighter-rouge">DECRBY</code>。</p>

<p><code class="language-plaintext highlighter-rouge">INCR</code> 是原子的怎么理解呢？多个客户端 <code class="language-plaintext highlighter-rouge">INCR</code> 同一个 key 的时候绝不会陷入静态条件，比如这样的情况绝不会发生：客户端 1 读到 10，客户端 2 同时也读到 10，它们都把值 <code class="language-plaintext highlighter-rouge">INCR</code> 到 11，最后新值绝对不会是 11，而是 12，因为 <code class="language-plaintext highlighter-rouge">INCR</code> 在进行读-增加-写的操作的同时，其他客户端的操作不会执行。</p>

<p>还有一些其他命令来操作字 string。比如 <code class="language-plaintext highlighter-rouge">GETSET</code> 命令把新 value 写入后返回旧 value。</p>

<p>在一条命令中同时获取和设置多个 key 的 value 可以有效降低延迟，这时你可以使用 <code class="language-plaintext highlighter-rouge">MSET</code> 和 <code class="language-plaintext highlighter-rouge">MGET</code> 命令：</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">&gt;</span><span class="w"> </span>mset a 10 b 20 c 30
<span class="go">OK
</span><span class="gp">&gt;</span><span class="w"> </span>mget a b c
<span class="go">1) "10"
2) "20"
3) "30"
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">MGET</code> 返回一个 value 数组。</p>

<h2 id="修改和查询-key-空间">
<a class="anchor" href="#%E4%BF%AE%E6%94%B9%E5%92%8C%E6%9F%A5%E8%AF%A2-key-%E7%A9%BA%E9%97%B4" aria-hidden="true"><span class="octicon octicon-link"></span></a>修改和查询 key 空间</h2>

<p>有一些命令不针对任何特定类型的数据，它不关心与 key 关联的 value 是何种数据类型。在与 key 进行操作时很有用。</p>

<p>比如，<code class="language-plaintext highlighter-rouge">EXISTS</code> 命令用于判断一个给定的 key 是否存在于 Redis 中，存在就返回 1，否则返回 0；<code class="language-plaintext highlighter-rouge">DEL</code> 命令删除给定 key 以及和它关联的 value，不管这个 value 是何种类型。</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">&gt;</span><span class="w"> </span><span class="nb">set </span>mykey hello
<span class="go">OK
</span><span class="gp">&gt;</span><span class="w"> </span>exists mykey
<span class="go">(integer) 1
</span><span class="gp">&gt;</span><span class="w"> </span>del mykey
<span class="go">(integer) 1
</span><span class="gp">&gt;</span><span class="w"> </span>exists mykey
<span class="go">(integer) 0
</span></code></pre></div></div>

<p>从上例可以看出，<code class="language-plaintext highlighter-rouge">DEL</code> 命令的返回值取决于它要删除的 key 是否存在，删除前 key 存在就返回 1，否则返回 0。</p>

<p>还有一些其他和 key 空间相关的命令，但是上面两个和命令 <code class="language-plaintext highlighter-rouge">TYPE</code> 最重要。<code class="language-plaintext highlighter-rouge">TYPE</code> 命令返回 key 对应的 value 的数据类型：</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">&gt;</span><span class="w"> </span><span class="nb">set </span>mykey x
<span class="go">OK
</span><span class="gp">&gt;</span><span class="w"> </span><span class="nb">type </span>mykey
<span class="go">string
</span><span class="gp">&gt;</span><span class="w"> </span>del mykey
<span class="go">(integer) 1
</span><span class="gp">&gt;</span><span class="w"> </span><span class="nb">type </span>mykey
<span class="go">none
</span></code></pre></div></div>

<h2 id="key-过期">
<a class="anchor" href="#key-%E8%BF%87%E6%9C%9F" aria-hidden="true"><span class="octicon octicon-link"></span></a>Key 过期</h2>

<p>在讨论更复杂的数据结构之前，我们需要先讨论另一个和具体数据类型无关的特性：过期。我们可以给 key 设置一个过期时间，来限制 key 的存在时间。一旦超过了过期时间，key 就会被自动销毁，就像使用了 <code class="language-plaintext highlighter-rouge">DEL</code> 命令那样。</p>

<ul>
  <li>过期时间可以精确到秒或者毫秒。</li>
  <li>不过，过期时间的分辨率总是 1 毫秒。</li>
  <li>过期信息被复制并持久化到磁盘上，即使 Redis 服务器停了，这个过期时间依然继续前进（Redis 保存了 key 过期的具体时刻）</li>
</ul>

<p>设置过期时间很简单：</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">&gt;</span><span class="w"> </span><span class="nb">set </span>key some-value
<span class="go">OK
</span><span class="gp">&gt;</span><span class="w"> </span>expire key 5
<span class="go">(integer) 1
</span><span class="gp">&gt;</span><span class="w"> </span>get key <span class="o">(</span>immediately<span class="o">)</span>
<span class="go">"some-value"
</span><span class="gp">&gt;</span><span class="w"> </span>get key <span class="o">(</span>after some <span class="nb">time</span><span class="o">)</span>
<span class="go">(nil)
</span></code></pre></div></div>

<p>上例中，第二次 <code class="language-plaintext highlighter-rouge">GET</code> 调用时 key 却不见了，因为第二个调用和第一次调用的间隔超过了 5 秒钟。上例中我们还用了 <code class="language-plaintext highlighter-rouge">EXPIRE</code> 命令来设置 key 的过期时间（<code class="language-plaintext highlighter-rouge">EXPIRE</code> 命令还可以修改已经存在的过期时间，类似地，<code class="language-plaintext highlighter-rouge">PERSIST</code> 命令可以移除过期时间，并使得 key 永存）。我们还可以在其他创建 key 的命令里顺便设置过期时间，比如使用 <code class="language-plaintext highlighter-rouge">SET</code> 命令的选项：</p>

<div class="language-console highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gp">&gt;</span><span class="w"> </span><span class="nb">set </span>key 100 ex 10
<span class="go">OK
</span><span class="gp">&gt;</span><span class="w"> </span>ttl key
<span class="go">(integer) 9
</span></code></pre></div></div>

<p>上例中把一个 key 的值设置为 100，并使它拥有 10 秒的过期时间。之后通过 <code class="language-plaintext highlighter-rouge">TTL</code> 命令来查看这个 key 剩余的生存时间。</p>

<p>如果要设置和检查剩余的毫秒数，可以使用 <code class="language-plaintext highlighter-rouge">PEXPIRE</code> 和 <code class="language-plaintext highlighter-rouge">PTTL</code> 命令，和 <code class="language-plaintext highlighter-rouge">SET</code> 命令中的 <code class="language-plaintext highlighter-rouge">PX</code> 选项。</p>

<h2 id="本部分涉及到的命令列表">
<a class="anchor" href="#%E6%9C%AC%E9%83%A8%E5%88%86%E6%B6%89%E5%8F%8A%E5%88%B0%E7%9A%84%E5%91%BD%E4%BB%A4%E5%88%97%E8%A1%A8" aria-hidden="true"><span class="octicon octicon-link"></span></a>本部分涉及到的命令列表</h2>

<p>这个列表是对命令的大致介绍。更加具体的内容，比如时间复杂度等，请到官网查看。</p>

<h3 id="基本-key-value-命令">
<a class="anchor" href="#%E5%9F%BA%E6%9C%AC-key-value-%E5%91%BD%E4%BB%A4" aria-hidden="true"><span class="octicon octicon-link"></span></a>基本 Key Value 命令</h3>

<ul>
  <li>
<code class="language-plaintext highlighter-rouge">COPY source destination [DB destination-db] [REPLACE]</code><br>
 <small>深复制一个 key。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">DEL key [key ...]</code><br>
 <small>删除一些 key。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">DUMP key</code><br>
 <small>获取 key 对应的 value 的序列化版本。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">EXISTS key [key ...]</code><br>
 <small>判断一些 key 是否存在。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">EXPIRE key seconds [NX|XX|GT|LT]</code><br>
 <small>设置 key 的秒级过期时间。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">EXPIREAT key timestamp [NX|XX|GT|LT]</code><br>
 <small>设置 key 的过期时刻为指定的 Unix 时间戳。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">EXPIRETIME key</code><br>
 <small>获取 key 的过期时刻（Unix 时间戳）。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">KEYS pattern</code><br>
 <small>得到所有符合指定模式的 key。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">MIGRATE host port key|"" destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key [key ...]]</code><br>
 <small>自动把 Redis 的 key 迁移到另一个 Redis 实例中。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">MOVE key db</code><br>
 <small>把 key 移动到另一个数据库。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">OBJECT ENCODING key</code><br>
 <small>查看 Redis 对象的内部编码。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">OBJECT FREQ key</code><br>
 <small>获取 Redis 对象的对数访问频率。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">OBJECT IDLETIME key</code><br>
 <small>获取对象从上次访问到现在的时间。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">OBJECT REFCOUNT key</code><br>
 <small>获取 key 对应的 value 的引用数量。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">PERSIST key</code><br>
 <small>移除 key 的过期时间。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">PEXPIRE key milliseconds [NX|XX|GT|LT]</code><br>
 <small>设置 key 的毫秒级过期时间。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">PEXPIREAT key milliseconds-timestamp [NX|XX|GT|LT]</code><br>
 <small>设置 key 的过期时刻为毫秒级 Unix 时间戳。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">PEXPIRETIME key</code><br>
 <small>获取 key 的过期时刻（毫秒级 Unix 时间戳）。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">PTTL key</code><br>
 <small>获取 key 剩余的生存毫秒数。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">RANDOMKEY</code><br>
 <small>从 key 空间中随机获取一个 key。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">RENAME key newkey</code><br>
 <small>重名名 key。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">RENAMENX key newkey</code><br>
 <small>重命名 key，仅当 <code class="language-plaintext highlighter-rouge">newkey</code> 不存在是成功。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">RESTORE key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]</code><br>
 <small>通过序列化 value 来创建 key。序列化的 value 来自 <code class="language-plaintext highlighter-rouge">DUMP</code>。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]</code><br>
 <small>以递增的方式遍历 key 空间。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]</code><br>
 <small>对 list、set 或者 sorted set 中的元素进行排序。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">SORT_RO key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA]</code><br>
 <small><code class="language-plaintext highlighter-rouge">SORT</code> 命令的只读版。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">TOUCH key [key ...]</code><br>
 <small>改变指定 key 的最后一次访问时间。返回存在于 key 空间中的 key 的数量。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">TTL key</code><br>
 <small>获取 key 剩余的存活秒数。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">TYPE key</code><br>
 <small>获得 key 对应的 value 的数据类型。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">UNLINK key [key ...]</code><br>
 <small>在另一个线程中异步地删除一个 key。与 <code class="language-plaintext highlighter-rouge">DEL</code> 不同，它是非阻塞的。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">WAIT numreplicas timeout</code><br>
 <small>Wait for the synchronous replication of all the write commands sent in the context of the current connection.</small>
</li>
</ul>

<h3 id="string-命令">
<a class="anchor" href="#string-%E5%91%BD%E4%BB%A4" aria-hidden="true"><span class="octicon octicon-link"></span></a>String 命令</h3>

<ul>
  <li>
<code class="language-plaintext highlighter-rouge">APPEND key value</code><br>
 <small>把≈ value 追加到 key 对应的 value 后面。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">GETRANGE key start end</code><br>
 <small>获取 key 对应的 string value 的子串。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">GETSET key value</code><br>
 <small>为 key 设置新的 value 并返回旧的 value。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">GET key</code><br>
 <small>获取 key 对应的 value。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">GETDEL key</code><br>
 <small>获取 key 对应的 value 后，删除此 key。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">GETEX key [EX seconds|PX milliseconds|EXAT unix-time|PXAT unix-time|PERSIST]</code><br>
 <small>获取 key 对应的 value 并顺便按需设置其过期时间。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">LCS key1 key2 [LEN] [IDX] [MINMATCHLEN len] [WITHMATCHLEN]</code><br>
 <small>查找最长公共子串。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">MGET key [key ...]</code><br>
 <small>一次性获取多个 key 对应的 value。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">MSET key value [key value ...]</code><br>
 <small>一次性设置多个 key 为对应的 value。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">MSETNX key value [key value ...]</code><br>
 <small>一次性设置多个 key 为对应的 value，仅当命令参数中的 key 都不存在时才成功。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">PSETEX key milliseconds value</code><br>
 <small>设置 key 的 value，同时为 key 设置一个毫秒级的过期时间。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">SET key value [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL] [NX|XX] [GET]</code><br>
 <small>为 key 设置 string value。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">SETEX key seconds value</code><br>
 <small>设置 key 的 value，同时为 key 设置一个秒级的过期时间。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">SETNX key value</code><br>
 <small>设置 key 的 value，仅当 key 不存在时成功。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">SETRANGE key offset value</code><br>
 <small>把一个 string 从指定偏移量处到末尾的部分替换为一个新 string。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">STRLEN key</code><br>
 <small>计算 key 对应的 string 长度。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">SUBSTR key start end</code><br>
 <small>求一个 key 对应 string value 的子串。</small>
</li>
</ul>

<h3 id="整数命令">
<a class="anchor" href="#%E6%95%B4%E6%95%B0%E5%91%BD%E4%BB%A4" aria-hidden="true"><span class="octicon octicon-link"></span></a>整数命令</h3>

<ul>
  <li>
<code class="language-plaintext highlighter-rouge">DECR key</code><br>
 <small>使 key 对应的整数 value 减一。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">DECRBY key decrement</code><br>
 <small>使 key 对应的整数 value 减去一个给定的整数。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">INCR key</code><br>
 <small>使 key 对应的整数 value 加一。</small>
</li>
  <li>
<code class="language-plaintext highlighter-rouge">INCRBY key increment</code><br>
 <small>使 key 对应的整数 value 增加一个给定整数。</small>
</li>
</ul>

<p>注意，Redis 中并没有所谓的“整数”类型数据，整数也是以字符串的方式存储，只是一旦字符串可以被当成整数使用时，可以使用一些专用命令。下面的浮点数也是这么回事。</p>

<h3 id="浮点数命令">
<a class="anchor" href="#%E6%B5%AE%E7%82%B9%E6%95%B0%E5%91%BD%E4%BB%A4" aria-hidden="true"><span class="octicon octicon-link"></span></a>浮点数命令</h3>

<ul>
  <li>
<code class="language-plaintext highlighter-rouge">INCRBYFLOAT key increment</code><br>
 <small>使 key 对应的浮点数 value 增加指定增量。</small>
</li>
</ul>
</article>
  </div>
  <div class="x-right">
    <h3>Redis</h3>
    
      <div class="x-collection-section">
        <h4>开始</h4>
        
        <ol>
          
            
              <li><a href="/redis/index.html">开始</a></li>
            
          
            
              <li><a href="/redis/install.html">安装</a></li>
            
          
            
              <li><a href="/redis/concept.html">相关概念预览</a></li>
            
          
        </ol>
      </div>
    
      <div class="x-collection-section">
        <h4>数据类型</h4>
        
        <ol>
          
            
              <li class="active"><a href="/redis/data-type/key-and-string.html">Key 和 String</a></li>
            
          
            
              <li><a href="/redis/data-type/list.html">List</a></li>
            
          
            
              <li><a href="/redis/data-type/hash.html">Hash</a></li>
            
          
            
              <li><a href="/redis/data-type/set.html">Set</a></li>
            
          
            
              <li><a href="/redis/data-type/zset.html">Sorted Set</a></li>
            
          
            
              <li><a href="/redis/data-type/bitmap.html">Bitmap</a></li>
            
          
            
              <li><a href="/redis/data-type/hyperloglog.html">Hyperloglog</a></li>
            
          
            
              <li><a href="/redis/data-type/geo.html">Geo</a></li>
            
          
        </ol>
      </div>
    
      <div class="x-collection-section">
        <h4>其他特性</h4>
        
        <ol>
          
            
              <li><a href="/redis/feature/pipeline.html">流水线处理</a></li>
            
          
        </ol>
      </div>
    
      <div class="x-collection-section">
        <h4>持久化</h4>
        
        <ol>
          
            
              <li><a href="/redis/persist/durability.html">持久化在说什么</a></li>
            
          
            
              <li><a href="/redis/persist/rdb.html">快照（Snapshotting）</a></li>
            
          
            
              <li><a href="/redis/persist/aof.html">AOF</a></li>
            
          
        </ol>
      </div>
    
      <div class="x-collection-section">
        <h4>运维</h4>
        
        <ol>
          
            
              <li><a href="/redis/ops/persistence.html">持久化方案</a></li>
            
          
        </ol>
      </div>
    
      <div class="x-collection-section">
        <h4>应用场景</h4>
        
        <ol>
          
            
              <li><a href="/redis/usecase/blogs.html">应用场景相关文章</a></li>
            
          
        </ol>
      </div>
    
  </div>
</div>
<footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <div class="footer-col-wrapper">
      <div class="footer-col">
        <p class="feed-subscribe">
          <a href="/feed.xml">
            <svg class="svg-icon orange">
              <use xlink:href="/assets/social-icons.svg#rss"></use>
            </svg><span>Subscribe</span>
          </a>
        </p>
      </div>
      <div class="footer-col">
        <p>Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</p>
      </div>
    </div>

    <div class="social-links"></div>

  </div>

</footer>
</body>
</html>
